home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.mactech.com 2010
/
ftp.mactech.com.tar
/
ftp.mactech.com
/
machack
/
Hacks95
/
Aaron 1.0b3.sit
/
Aaron 1.0b3
/
Aaron Source
/
CDEF and Patches
/
PPCPatches.c
< prev
next >
Wrap
Text File
|
1995-06-24
|
19KB
|
720 lines
/* Aaron © 1995 Gregory D. Landweber, ALL RIGHTS RESERVED */
#include <Processes.h>
#include <GestaltEqu.h>
#include <FragLoad.h>
#include "CDEF.h"
#define IsFinder() (GetProcessSignature() == 'MACS')
OSType GetProcessSignature ( void );
// for the blue menu highlighting hack
pascal void MyRGBBackColor ( RGBColor *theColor );
pascal void MyRGBForeColor ( RGBColor *theColor );
// for menu bar tinge
pascal void MyDrawMenuBar ( void );
// for the gray Finder info header
pascal void MyBeginUpdate ( WindowPtr theWindow ); // copland
// to install the CDEFs, etc.
pascal Handle MyGetResource ( ResType rType, short rID );
// to keep the resource file open permanently
pascal void MyCloseResFile ( short rfRefNum );
// globals
enum {
iRGBBackColor = 0,
iRGBForeColor,
iDrawMenuBar,
iBeginUpdate,
iGetResource,
iCloseResFile
};
typedef struct {
short systemFont;
short refNum;
short buttonsCDEF;
short newFolderCDEF;
short sysFontNum;
} PrefsRecord;
PrefsRecord *gPrefs;
typedef struct {
RGBColor finderColor;
RGBColor dialogColor;
Boolean colorFinder;
Boolean colorDialogs;
Boolean colorButtons;
Boolean changeFont;
short systemFont;
short sysFontFam;
long sysVersion;
short refNum;
short buttonsCDEF;
short newFolderCDEF;
short sysFontNum;
Boolean finderLabel;
} GBPrefsRecord;
#ifndef __powerc // 680x0 Code
#include <A4Stuff.h>
void GetIconType ( void );
void KeepMeAround ( void );
pascal OSErr MyGestaltSelector ( OSType selector, long *response );
void main ( short refNum );
UniversalProcPtr gOriginalTraps[6];
PrefsRecord gPrefsRec;
typedef pascal void ( *RGBBackColorType ) ( RGBColor * );
typedef pascal void ( *BeginUpdateType ) ( WindowPtr );
typedef pascal Handle ( *GetResourceType ) ( ResType rType, short rID );
typedef pascal void ( *CloseResFileType ) ( short );
typedef pascal void ( *DrawMenuBarType ) ( void );
void _MyRGBBackColor ( void );
void _MyRGBForeColor ( void );
void _MyBeginUpdate ( void );
void _MyGetResource ( void );
void _MyCloseResFile ( void );
void _MyDrawMenuBar ( void );
asm void _MyRGBBackColor ( void )
{
movem.l d0/d1/d2/a1/a4,-(sp);
jsr SetCurrentA4;
move.l 24(sp),-(sp);
jsr MyRGBBackColor;
movem.l (sp)+,d0/d1/d2/a1/a4;
move.l (sp)+,a0;
addq.l %4,sp;
jmp (a0);
}
asm void _MyRGBForeColor ( void )
{
movem.l d0/d1/d2/a1/a4,-(sp);
jsr SetCurrentA4;
move.l 24(sp),-(sp);
jsr MyRGBForeColor;
movem.l (sp)+,d0/d1/d2/a1/a4;
move.l (sp)+,a0;
addq.l %4,sp;
jmp (a0);
}
asm void _MyBeginUpdate ( void )
{
movem.l d0/d1/d2/a1/a4,-(sp);
jsr SetCurrentA4;
move.l 24(sp),-(sp);
jsr MyBeginUpdate;
movem.l (sp)+,d0/d1/d2/a1/a4;
move.l (sp)+,a0;
addq.l %4,sp;
jmp (a0);
}
asm void _MyGetResource ( void )
{
movem.l d0/d1/d2/a1/a4,-(sp);
jsr SetCurrentA4;
subq.l %4,sp;
move.l 30(sp),-(sp);
move.w 32(sp),-(sp);
jsr MyGetResource;
move.l (sp)+,30(sp);
movem.l (sp)+,d0/d1/d2/a1/a4;
move.l (sp)+,a0;
addq.l %6,sp;
move.w 0x0a60,d0;
ext.l d0;
jmp (a0);
}
asm void _MyCloseResFile ( void )
{
movem.l d0/d1/d2/a1/a4,-(sp);
jsr SetCurrentA4;
move.w 24(sp),-(sp);
jsr MyCloseResFile;
movem.l (sp)+,d0/d1/d2/a1/a4;
move.l (sp)+,a0;
addq.l %2,sp;
jmp (a0);
}
asm void _MyDrawMenuBar ( void )
{
movem.l d0/d1/d2/a1/a4,-(sp);
jsr SetCurrentA4;
jsr MyDrawMenuBar;
movem.l (sp)+,d0/d1/d2/a1/a4;
rts;
}
#else // PowerPC code
void main ( UniversalProcPtr *, UniversalProcPtr *, PrefsRecord * );
enum {
uppRGBBackColorProcInfo = kPascalStackBased
| STACK_ROUTINE_PARAMETER(1, kFourByteCode),
uppBeginUpdateProcInfo = kPascalStackBased
| STACK_ROUTINE_PARAMETER(1, kFourByteCode),
uppGetResourceProcInfo = kPascalStackBased
| RESULT_SIZE(kFourByteCode)
| STACK_ROUTINE_PARAMETER(1, kFourByteCode)
| STACK_ROUTINE_PARAMETER(2, kTwoByteCode),
uppCloseResFileProcInfo = kPascalStackBased
| STACK_ROUTINE_PARAMETER(1, kTwoByteCode),
uppMainProcInfo = kCStackBased
| STACK_ROUTINE_PARAMETER(1, kFourByteCode)
| STACK_ROUTINE_PARAMETER(2, kFourByteCode)
| STACK_ROUTINE_PARAMETER(3, kFourByteCode),
uppDrawMenuBarProcInfo = kPascalStackBased
};
UniversalProcPtr *gOriginalTraps;
ProcInfoType __procinfo = uppMainProcInfo;
#endif
typedef struct _res_map res_map;
typedef struct _res_map *res_map_ptr;
typedef struct _res_map **res_map_handle;
struct _res_map {
long void1; /* Reserved */
long void2; /* Reserved */
long void3; /* Reserved */
long void4; /* Reserved */
res_map_handle next_map; /* Handle of next resource map */
short refNum; /* fRefNum for this file */
short fileAttrs; /* Resource file attributes for this file */
short tlOffset; /* Type List Offset from beginning of map */
short nlOffset; /* Name List Offset from beginning of map */
};
pascal void MyCloseResFile ( short refNum )
{
if ( refNum == gPrefs->refNum ) {
UpdateResFile ( refNum );
if ( CurResFile() == refNum )
UseResFile ( (*(res_map_handle)LMGetTopMapHndl())->refNum );
}
else
#ifndef __powerc
( *(CloseResFileType)gOriginalTraps[iCloseResFile] ) ( refNum );
#else
CallUniversalProc ( gOriginalTraps[iCloseResFile], uppCloseResFileProcInfo,
refNum );
#endif
}
struct TIconObject;
//struct TIconObject71;
struct TIconListObject;
struct TWindowObject;
struct TIconListObject
{
long fByteCount;
long fByteSize;
struct TIconObject** fObjects[1];
};
struct TIconObject {
char stuff0[0x08]; // 00
char fLabel; // 08
char stuff6; // 09
struct TIconObject** fParent; // 0A
char stuff1[0x0A]; // 0E
struct TIconListObject** fChildren; // 18
struct TWindowObject** fMainWindow; // 1C
char stuff2[4]; // 20
unsigned stuff3 : 12; // 24
unsigned fSelected : 1; // 25:3
char stuff4[0x06]; // 26
long fCNID; // 2C
short fVRefNum; // 30
char stuff5[0x1B]; // 32
};
struct TWindowObject {
long fVTablePtr;
WindowPtr fWindow;
struct TIconObject** fOwner;
long fThing;
WindowPtr fPort;
};
pascal void MyBeginUpdate ( WindowPtr theWindow )
{
char **refCon;
#define kFinderWindowKind 20
if ( ( ((WindowPeek)theWindow)->windowKind == kFinderWindowKind ) &&
((WindowPeek)theWindow)->visible &&
( refCon = (char **)GetWRefCon ( theWindow ) ) &&
( GetWVariant ( theWindow ) == zoomDocProc ) && IsFinder() &&
(*(*(struct TWindowObject **)refCon)->fOwner)->fParent ) {
InsetRgn ( ((WindowPeek)theWindow)->updateRgn, -1, 0 );
}
#ifndef __powerc
( *(BeginUpdateType)gOriginalTraps[iBeginUpdate] ) ( theWindow );
#else
CallUniversalProc ( gOriginalTraps[iBeginUpdate], uppBeginUpdateProcInfo,
theWindow );
#endif
if ( ( ((WindowPeek)theWindow)->windowKind == kFinderWindowKind ) &&
((WindowPeek)theWindow)->visible &&
( refCon = (char **)GetWRefCon ( theWindow ) ) &&
( GetWVariant ( theWindow ) == zoomDocProc ) && IsFinder() &&
(*(*(struct TWindowObject **)refCon)->fOwner)->fParent ) {
GrafPtr savePort;
Rect theRect;
FontInfo fInfo;
short temp;
Handle finderPrefs = GetResource ( 'fval', 128 );
GetPort ( &savePort );
SetPort ( theWindow );
GetFontInfo ( &fInfo );
if ( finderPrefs && *finderPrefs && ((char *)*finderPrefs)[0x17] && (*refCon)[0x29] >= 2 ) {
temp = ( ( fInfo.ascent + fInfo.descent ) * 19 - 15 ) / 6;
if ( temp < 26 )
temp = 26;
}
else {
temp = ( ( fInfo.ascent + fInfo.descent ) * 5 - 8 ) / 3;
if ( temp < 17 )
temp = 17;
}
theRect = theWindow->portRect;
theRect.bottom = theRect.top + temp;
{
RGBColor saveBackColor, saveForeColor;
RGBColor grayBackColor = { 0xdddd, 0xdddd, 0xdddd };
RGBColor whiteForeColor = { 0xFFFF, 0xFFFF, 0xFFFF };
RGBColor darkForeColor = { 0xaaaa, 0xaaaa, 0xaaaa };
Point saveLoc;
GetPen ( &saveLoc );
GetBackColor ( &saveBackColor );
GetForeColor ( &saveForeColor );
RGBBackColor ( &grayBackColor );
EraseRect ( &theRect );
RGBBackColor ( &whiteForeColor );
RGBForeColor ( &whiteForeColor );
MoveTo ( theRect.left, theRect.bottom - 1 );
LineTo ( theRect.left, theRect.top );
LineTo ( theRect.right - 1, theRect.top );
RGBBackColor ( &darkForeColor );
RGBForeColor ( &darkForeColor );
MoveTo ( theRect.left, theRect.bottom - 1 );
LineTo ( theRect.right - 1, theRect.bottom - 1 );
LineTo ( theRect.right - 1, theRect.top );
RGBBackColor ( &saveBackColor );
RGBForeColor ( &saveForeColor );
MoveTo ( saveLoc.h, saveLoc.v );
}
SetPort ( savePort );
}
}
pascal void MyRGBForeColor ( RGBColor *theColor )
{
if ( theColor->red == 0xdddc && theColor->green == 0xdddc && theColor->blue == 0xdddc )
theColor->red = theColor->green = theColor->blue = 0xFFFE;
if ( theColor->red == 0x0001 && theColor->green == 0x0001 && theColor->blue == 0x7778 )
theColor->red = theColor->green = theColor->blue = 0x0001;
#ifndef __powerc
( *(RGBBackColorType)gOriginalTraps[iRGBForeColor] ) ( theColor );
#else
CallUniversalProc ( gOriginalTraps[iRGBForeColor], uppRGBBackColorProcInfo, theColor );
#endif
}
pascal void MyRGBBackColor ( RGBColor *theColor )
{
if ( theColor->red == 0x0001 && theColor->green == 0x0001 && theColor->blue == 0x0001 ) {
theColor->red = theColor->green = 0x0001;
theColor->blue = 0x7778;
}
if ( theColor->red == 0xFFFE && theColor->green == 0xFFFE && theColor->blue == 0xFFFE )
theColor->red = theColor->green = theColor->blue = 0xdddc;
#ifndef __powerc
( *(RGBBackColorType)gOriginalTraps[iRGBBackColor] ) ( theColor );
#else
CallUniversalProc ( gOriginalTraps[iRGBBackColor], uppRGBBackColorProcInfo,
theColor );
#endif
}
pascal void MyDrawMenuBar ( void )
{
#ifndef __powerc
( *(DrawMenuBarType)gOriginalTraps[iDrawMenuBar] ) ();
#else
CallUniversalProc ( gOriginalTraps[iDrawMenuBar], uppDrawMenuBarProcInfo );
#endif
// if ( LMGetCurApRefNum() ) {
{
short theHeight;
RGBColor saveColor, theColor = { 0x8888, 0x8888, 0x8888 },
whiteColor = { 0xFFFF, 0xFFFF, 0xFFFF };
GrafPtr savePort, myPort;
GDHandle theDevice = GetMainDevice();
theHeight = LMGetMBarHeight();
if ( theHeight > 0 ) {
GetPort ( &savePort );
GetCWMgrPort ( (CGrafPtr *)&myPort );
SetPort ( myPort );
GetForeColor ( &saveColor );
RGBForeColor ( &theColor );
MoveTo ( (*theDevice)->gdRect.left, (*theDevice)->gdRect.top + theHeight - 2 );
LineTo ( (*theDevice)->gdRect.right, (*theDevice)->gdRect.top + theHeight - 2 );
RGBForeColor ( &whiteColor );
MoveTo ( (*theDevice)->gdRect.left + 5, (*theDevice)->gdRect.top );
LineTo ( (*theDevice)->gdRect.right - 6, (*theDevice)->gdRect.top );
RGBForeColor ( &theColor );
SetPort ( savePort );
}
}
}
OSType GetProcessSignature ( void )
{
ProcessSerialNumber PSN = { 0, kCurrentProcess };
ProcessInfoRec info;
if ( ( LMGetCurApRefNum() == 0 ) || ( LMGetCurApName()[0] > 31 ) )
return 0;
info.processInfoLength = sizeof(info);
info.processName = nil;
info.processAppSpec = nil;
GetProcessInformation ( &PSN, &info );
return info.processSignature;
}
#ifndef __powerc
#define OriginalGetResource(rType,rID) \
( *(GetResourceType)gOriginalTraps[iGetResource] ) ( rType, rID )
#else
#define OriginalGetResource(rType,rID) \
(Handle) CallUniversalProc ( gOriginalTraps[iGetResource], uppGetResourceProcInfo, \
rType, rID )
#endif
Handle GetResourceFromMyFile ( ResType rType, short rID );
Handle GetResourceFromMyFile ( ResType rType, short rID )
{
short refNum = CurResFile();
Handle theHandle;
UseResFile ( gPrefs->refNum );
theHandle = Get1Resource ( rType, rID );
UseResFile ( refNum );
return theHandle;
}
pascal Handle MyGetResource ( ResType rType, short rID )
{
unsigned char oldRomMapInsert;
unsigned char oldTmpResLoad;
Handle theHandle;
Boolean done = false;
GBPrefsRecord *gbPrefs;
oldRomMapInsert = LMGetROMMapInsert();
oldTmpResLoad = LMGetTmpResLoad();
switch ( rType ) {
case 'ICN#' :
case 'icl4' :
case 'icl8' :
case 'ics#' :
case 'ics4' :
case 'ics8' :
if ( rID == -16494 || rID == -16482 || rID == -16386 || rID == -3999 || rID == -3994 ||
rID == -3993 || ( rID >= -3984 && rID <= -3973 ) || rID == -3968 ) {
theHandle = GetResourceFromMyFile ( rType, rID );
if ( theHandle )
done = true;
}
break;
case 'WDEF' :
if ( rID == 0 ) {
Handle theWDEF;
short refNum;
theHandle = OriginalGetResource ( 'WDEF', 0 );
refNum = CurResFile();
UseResFile ( 0 );
theWDEF = OriginalGetResource ( 'WDEF', 0 );
UseResFile ( refNum );
if ( theHandle == theWDEF ) {
theHandle = GetResourceFromMyFile ( rType, rID );
if ( theHandle )
done = true;
}
else
done = true;
}
break;
case 'CDEF' :
if ( rID == 1 ) {
theHandle = GetResourceFromMyFile ( rType, rID );
if ( theHandle )
done = true;
break;
}
// Let Greg's Buttons override us
if ( ( Gestalt ( 'GrEG', (long *)&gbPrefs ) == noErr ) && gbPrefs->colorButtons )
break;
if ( rID == 61 ) {
theHandle = GetResourceFromMyFile ( rType, rID );
if ( theHandle )
done = true;
break;
}
if ( rID == 0 ) {
Handle theCDEF;
short refNum;
short resID = gPrefs->buttonsCDEF;
theHandle = OriginalGetResource ( 'CDEF', 0 );
refNum = CurResFile();
UseResFile ( 0 );
theCDEF = OriginalGetResource ( 'CDEF', 0 );
UseResFile ( refNum );
// Hack to avoid loading PowerPC CDEF within a Desk Accessory
if ( ( resID == 2 ) &&
LMGetCurApRefNum() && ( LMGetCurApName()[0] <= 31 ) ) {
ProcessSerialNumber PSN = { 0, kCurrentProcess };
ProcessInfoRec info;
info.processInfoLength = sizeof(info);
info.processName = nil;
info.processAppSpec = nil;
GetProcessInformation ( &PSN, &info );
if ( info.processType == 'dfil' )
resID = 0;
//if ( info.processSignature == 'SII2' ) // Suitcase Fix
if ( info.processType == 'INIT' )
resID = 0;
}
// End of DA hack
if ( theHandle == theCDEF ) {
theHandle = GetResourceFromMyFile ( 'CDEF', resID );
if ( theHandle )
done = true;
}
else
done = true;
}
break;
case 'NFNT' :
// Let Greg's Buttons override us
if ( ( Gestalt ( 'GrEG', (long *)&gbPrefs ) == noErr ) && gbPrefs->changeFont )
break;
if ( ( rID == gPrefs->sysFontNum ) || ( rID == -116 ) )
rID = gPrefs->systemFont;
break;
}
if ( !done ) {
LMSetROMMapInsert(oldRomMapInsert);
LMSetTmpResLoad(oldTmpResLoad);
theHandle = OriginalGetResource ( rType, rID );
}
return theHandle;
}
#ifndef __powerc // 680x0 code
// 680x0 code only
pascal OSErr MyGestaltSelector ( OSType selector, long *response )
{
long oldA4 = SetCurrentA4();
*response = (long)gPrefs->refNum;
SetA4( oldA4 );
return noErr;
}
/*
pascal OSErr MyGestaltSelector ( OSType selector, long *response )
{
long oldA4 = SetCurrentA4();
*response = (long)gPrefs;
SetA4( oldA4 );
return noErr;
}
*/
// 680x0 code only
void main ( short refNum )
{
UniversalProcPtr newTraps[6];
long result;
long oldA4;
oldA4 = SetCurrentA4();
newTraps[iRGBBackColor] = (ProcPtr)_MyRGBBackColor;
newTraps[iRGBForeColor] = (ProcPtr)_MyRGBForeColor;
newTraps[iBeginUpdate] = (ProcPtr)_MyBeginUpdate;
newTraps[iGetResource] = (ProcPtr)_MyGetResource;
newTraps[iCloseResFile] = (ProcPtr)_MyCloseResFile;
newTraps[iDrawMenuBar] = (ProcPtr)_MyDrawMenuBar;
gPrefs = &gPrefsRec;
gPrefs->refNum = refNum;
gPrefs->buttonsCDEF = 0;
gPrefs->newFolderCDEF = 61;
gPrefs->systemFont = 16301;
// Check the FOND for the system font to determine the FONT/NFNT ID of the size
// 12 bitmap, for which we substitute our own.
{
Handle theFOND;
short numFonts;
UseResFile ( 0 );
theFOND = GetResource ( 'FOND', LMGetSysFontFam() );
UseResFile ( refNum );
gPrefs->sysFontNum = 12;
if ( theFOND && *theFOND )
for ( numFonts = *(short *)(*theFOND + 52 ); numFonts >= 0; numFonts-- )
if ( *(long *)(*theFOND + 54 + 6 * numFonts ) == 0x000C0000 ) {
gPrefs->sysFontNum = *(short *)(*theFOND + 58 + 6 * numFonts );
break;
}
}
NewGestalt ( 'Copl', MyGestaltSelector );
// if ( NewGestalt ( 'GrEG', MyGestaltSelector ) == noErr ) {
gOriginalTraps[iRGBBackColor] = GetToolTrapAddress ( _RGBBackColor );
gOriginalTraps[iRGBForeColor] = GetToolTrapAddress ( _RGBForeColor );
gOriginalTraps[iBeginUpdate] = GetToolTrapAddress ( _BeginUpDate );
gOriginalTraps[iGetResource] = GetToolTrapAddress ( _GetResource );
gOriginalTraps[iCloseResFile] = GetToolTrapAddress ( _CloseResFile );
gOriginalTraps[iDrawMenuBar] = GetToolTrapAddress ( _DrawMenuBar );
if ( ( Gestalt ( gestaltMixedModeAttr, &result ) == noErr ) &&
( result & ( 1 << gestaltPowerPCAware ) ) ) {
Handle theHandle;
theHandle = GetResource ( 'PACH', 131 );
if ( theHandle && *theHandle ) {
DetachResource ( theHandle );
( ( void (*) ( UniversalProcPtr *, UniversalProcPtr *, PrefsRecord * ) ) *theHandle )
( gOriginalTraps, newTraps, gPrefs );
}
}
SetToolTrapAddress ( newTraps[iRGBBackColor], _RGBBackColor );
SetToolTrapAddress ( newTraps[iRGBForeColor], _RGBForeColor );
SetToolTrapAddress ( newTraps[iBeginUpdate], _BeginUpDate );
SetToolTrapAddress ( newTraps[iGetResource], _GetResource );
SetToolTrapAddress ( newTraps[iCloseResFile], _CloseResFile );
SetToolTrapAddress ( newTraps[iDrawMenuBar], _DrawMenuBar );
// }
SetA4 ( oldA4 );
}
#else // PowerPC code
// PowePC code only
void main ( UniversalProcPtr *originalTraps, UniversalProcPtr *newTraps, PrefsRecord *prefs )
{
THz saveZone = GetZone();
SetZone ( SystemZone() );
gPrefs = prefs;
gOriginalTraps = originalTraps;
newTraps[iRGBBackColor] = NewFatRoutineDescriptor
( (ProcPtr)newTraps[iRGBBackColor], (ProcPtr)MyRGBBackColor, uppRGBBackColorProcInfo );
newTraps[iRGBForeColor] = NewFatRoutineDescriptor
( (ProcPtr)newTraps[iRGBForeColor], (ProcPtr)MyRGBForeColor, uppRGBBackColorProcInfo );
newTraps[iBeginUpdate] = NewFatRoutineDescriptor
( (ProcPtr)newTraps[iBeginUpdate], (ProcPtr)MyBeginUpdate, uppBeginUpdateProcInfo );
newTraps[iGetResource] = NewFatRoutineDescriptor
( (ProcPtr)newTraps[iGetResource], (ProcPtr)MyGetResource, uppGetResourceProcInfo );
newTraps[iCloseResFile] = NewFatRoutineDescriptor
( (ProcPtr)newTraps[iCloseResFile], (ProcPtr)MyCloseResFile, uppCloseResFileProcInfo );
newTraps[iDrawMenuBar] = NewFatRoutineDescriptor
( (ProcPtr)newTraps[iDrawMenuBar], (ProcPtr)MyDrawMenuBar, uppDrawMenuBarProcInfo );
gPrefs->buttonsCDEF = 2;
gPrefs->newFolderCDEF = 61;
SetZone ( saveZone );
}
#endif